#include <iostream>
#include <unistd.h>
#include <signal.h>

using namespace std;

void Print(sigset_t& pending)
{
    for (int i = 31; i >= 1; i--)
    {
        if (sigismember(&pending, i))
        {
            cout << "1";
        }
        else cout << "0";
    }
    cout << endl << endl;
}

void handler(int signo)
{
    cout << "get a signo: " << signo << endl;
}

int main()
{
    
    // 4、我可以将所有信号都进行屏蔽，信号不就不会被处理了吗？
    sigset_t bset, oset;
    sigemptyset(&bset);
    sigemptyset(&oset);
    for (int i = 1; i <= 31; i++)
    {
        sigaddset(&bset, i);
    }
    sigprocmask(SIG_SETMASK, &bset, &oset);
    sigset_t pending;
    sigemptyset(&pending);
    while (1)
    {
        int n = sigpending(&pending);
        if (n < 0) continue;
        Print(pending);
        sleep(1);
    }


    // // 0、对2号信号进行自定义捕捉
    // signal(2, handler);
    // // 1、先对2号信号进行屏蔽——数据预备
    // sigset_t bset, oset; // 在哪里开辟得空间？？ 用户栈上的，属于用户区
    // sigemptyset(&bset);
    // sigemptyset(&oset);
    // sigaddset(&bset, 2); // 已经把2号信号屏蔽了吗？并没有设置进入你的进程的task_struct
    // // 1.2 调用系统调用，将数据设置进内核
    // sigprocmask(SIG_SETMASK, &bset, &oset); // 已经把2号信号屏蔽了

    // // 2、重复打印当前进程的pending 000000000000000000000
    // sigset_t pending;
    // int cnt = 0;
    // while (1)
    // {
    //     // 2.1 获取
    //     int n = sigpending(&pending);
    //     if (n < 0) continue;
    //     // 2.2 打印
    //     Print(pending);
    //     sleep(1);
    //     cnt++;
    //     // 2.3 解除阻塞
    //     if (cnt == 20)
    //     {
    //         cout << "unblock 2 signo" << endl;
    //         sigprocmask(SIG_SETMASK, &oset, nullptr); 
    //     }
    // }

    // // 3、发送2号信号 000000000000000000000000010

    return 0;
}
